From 8230bf8089bb3a892ad56dc4f59910bf699f3fc0 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Sat, 23 Apr 2005 11:10:11 +0000 Subject: [PATCH] bitkeeper revision 1.1374 (426a2d13oNszAPe4DJtPXXT5G-vZVQ) evtchn.c: Fix freebsd lockup. --- freebsd-5.3-xen-sparse/i386-xen/i386-xen/evtchn.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/freebsd-5.3-xen-sparse/i386-xen/i386-xen/evtchn.c b/freebsd-5.3-xen-sparse/i386-xen/i386-xen/evtchn.c index c0b393d8dd..76289bb0ef 100644 --- a/freebsd-5.3-xen-sparse/i386-xen/i386-xen/evtchn.c +++ b/freebsd-5.3-xen-sparse/i386-xen/i386-xen/evtchn.c @@ -54,7 +54,7 @@ evtchn_do_upcall(struct intrframe *frame) { unsigned long l1, l2; unsigned int l1i, l2i, port; - int irq; + int irq, owned; unsigned long flags; shared_info_t *s = HYPERVISOR_shared_info; vcpu_info_t *vcpu_info = &s->vcpu_data[smp_processor_id()]; @@ -78,12 +78,16 @@ evtchn_do_upcall(struct intrframe *frame) l2 &= ~(1 << l2i); port = (l1i << 5) + l2i; + if ( (owned = mtx_owned(&sched_lock)) != 0 ) + mtx_unlock_spin_flags(&sched_lock, MTX_QUIET); if ( (irq = evtchn_to_irq[port]) != -1 ) { struct intsrc *isrc = intr_lookup_source(irq); intr_execute_handlers(isrc, frame); } else { evtchn_device_upcall(port); } + if ( owned ) + mtx_lock_spin_flags(&sched_lock, MTX_QUIET); } } } -- 2.30.2